/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package lk;

import java.util.ArrayList;

/**
 *
 * @author apple
 */
public class VueloXRuta {
    public Vuelo vuelo;
    public Ruta ruta;


    public VueloXRuta(Ruta ruta, Vuelo vuelo){
        this.ruta = ruta;
        this.vuelo = vuelo;
    }

    public VueloXRuta(){
    }
    
    public VueloXRuta get(Ruta rut){
        VueloXRuta vuelos = new VueloXRuta();
        return vuelos;
    }  
    
    public ArrayList<Vuelo> get(Ruta rut, int i, int opt){
        /*Devuelve los vuelos de la ruta hasta i*/
        ArrayList<Vuelo> vuelos = new ArrayList<Vuelo>();
        for(int j=0; j<opt; j++){
            vuelos.add(rut.vuelos.get(i));
            i++;
        }
        return vuelos;
    }
    
    public ArrayList<ArrayList<Vuelo>> getRandom(ArrayList<Vuelo> vuelos, ArrayList<Vuelo> vueloX, int opt, Fecha fechaCreacion, ArrayList<ReservaAlmacen> reservas){
        /*Devuelve todos los vuelos disponibles menos los de la ruta*/
        boolean flag = false;
        
        ArrayList<ArrayList<Vuelo>> vuelosY = new ArrayList<ArrayList<Vuelo>>();
        ArrayList<Vuelo> vueloY = new ArrayList<Vuelo>();
        ArrayList<Vuelo> vueloOrigen = new ArrayList<Vuelo>();
        ArrayList<Vuelo> vueloDestino = new ArrayList<Vuelo>();
        ArrayList<Vuelo> vueloInter= new ArrayList<Vuelo>();
        
        Vuelo origen = vueloX.get(0);
        Vuelo destino = vueloX.get(vueloX.size()-1);
        
        /*¿El vuelo es inter?*/
        for(int i=0; i<vueloX.size(); i++){
            if ( vueloX.get(i).tipo == 1) flag = flag || true;
            vuelos.remove(vueloX.get(i));
        }
        
        /*Busco todos los vuelos inter que coinciden con a lo más 24 hrs de diff*/
        if (flag){
            for(int i=0; i<vuelos.size(); i++){            
                if(((vuelos.get(i).tipo == 0) && (vuelos.get(i).idVuelo != origen.idVuelo)) 
                        && (Fecha.restar(vuelos.get(i).fechaSalida, fechaCreacion) <= 24) && vuelos.get(i).tipo==1)
                    vueloInter.add(vuelos.get(i));
            }
        }
        
        /*Busco todos los vuelos origen que coinciden con origen de vueloX*/
  
        for(int i=0;i<vuelos.size(); i++){            
            if((!vuelos.get(i).origen.diff(origen.origen)) && (vuelos.get(i).idVuelo != origen.idVuelo)
                && (Fecha.restar(vuelos.get(i).fechaSalida, fechaCreacion) <= 12) && vuelos.get(i).tipo==0)
                vueloOrigen.add(vuelos.get(i));

        }

        /*Busco todos los vuelos destino que coinciden con destino de vueloX*/
   
        for(int i=0; i<vuelos.size(); i++){            
            if((!vuelos.get(i).destino.diff(destino.destino)) && (vuelos.get(i).idVuelo != destino.idVuelo)
                && (Fecha.restar(vuelos.get(i).fechaSalida, fechaCreacion) <= 36))
                vueloDestino.add(vuelos.get(i));
        }
        
         
        
        if (flag){
            for(int i=0; i<opt; i++){ 
                switch (i){
                    case (0):        
                        for(int j=0; j<vueloInter.size(); j++){
                            if(!vueloInter.get(j).destino.diff(origen.destino))
                                vueloY.add(vueloInter.get(j));
                            if(!vueloY.isEmpty()) vuelosY.add(vueloY);
                            vueloY.clear();

                        }
                    case (1):  
                        for(int j=0; j<vueloOrigen.size(); j++){
                            for(int k=0; k<vueloDestino.size(); k++){
                                if(!vueloOrigen.get(j).destino.diff(vueloDestino.get(k).origen)
                                        && (vueloOrigen.get(j).duracion+vueloDestino.get(k).duracion <= 48)
                                        && Fecha.restar(fechaCreacion, vueloDestino.get(k).fechaLlegada)<=48){
                                    vueloY.add(vueloOrigen.get(j));
                                    vueloY.add(vueloDestino.get(k));
                                }
                                if(!vueloY.isEmpty()) vuelosY.add(vueloY);
                                vueloY.clear();
                            }

                        }
                     case (2):  
                        for(int j=0; j<vueloOrigen.size(); j++){
                            for(int k=0; k<vueloDestino.size(); k++){
                                for(int m=0; m<vuelos.size(); m++){
                                    if(!vueloOrigen.get(j).destino.diff(vuelos.get(k).origen)
                                            && !vueloOrigen.get(j).destino.diff(vuelos.get(k).origen)
                                            && (vueloOrigen.get(j).duracion+vuelos.get(m).duracion+vueloDestino.get(k).duracion <= 48)
                                            && Fecha.restar(fechaCreacion, vueloDestino.get(k).fechaLlegada)<=48){
                                        vueloY.add(vueloOrigen.get(j));
                                        vueloY.add(vueloDestino.get(k));
                                    }
                                }
                                if(!vueloY.isEmpty()) vuelosY.add(vueloY);
                                vueloY.clear();
                            }

                        }
                }
            }
        }
        else{
            for(int i=0; i<opt; i++){ 
                switch (i){
                    case (0):        
                        for(int j=0; j<vueloOrigen.size(); j++){
                            if(!vueloOrigen.get(j).destino.diff(destino.destino))
                                vueloY.add(vueloOrigen.get(j));
                            if(!vueloY.isEmpty()) vuelosY.add(vueloY);
                            vueloY.clear();

                        }
                    case (1):  
                        for(int j=0; j<vueloOrigen.size(); j++){
                            for(int k=0; k<vueloDestino.size(); k++){
                                if(!vueloOrigen.get(j).destino.diff(vueloDestino.get(k).origen)
                                        && (vueloOrigen.get(j).duracion+vueloDestino.get(k).duracion <= 24)
                                        && Fecha.restar(fechaCreacion, vueloDestino.get(k).fechaLlegada)<=24){
                                    vueloY.add(vueloOrigen.get(j));
                                    vueloY.add(vueloDestino.get(k));
                                }
                                if(!vueloY.isEmpty()) vuelosY.add(vueloY);
                                vueloY.clear();
                            }

                        }
                }
            }
        }
        
        
        return vuelosY;
    }
    
    public int Cantidad(Ruta rut){
        int cant = rut.vuelos.size();
        return cant;
    }
    
    public Ruta Reemplazar(Ruta rut, ArrayList<Vuelo> vueloX, ArrayList<Vuelo> vueloY){
        ruta = new Ruta();
        int i, j=0;
        
        for(i=0; i< rut.vuelos.size(); i++){
            if (rut.vuelos.get(i).equals(vueloX.get(j))) break;
            ruta.vuelos.add(rut.vuelos.get(i));
        }
            
        for(j=0; j<vueloY.size(); j++){
            ruta.vuelos.add(vueloY.get(j));
            i++;
        }
            
        for(;i< rut.vuelos.size(); i++){
            ruta.vuelos.add(rut.vuelos.get(i));
        }
        
        return ruta;
    }
}
